When comprehending an application, one aspect of comprehension may include understanding the coarse-grained structure of the application in terms of functionally cohesive groups of program units in the application. The functionally cohesive groups may be designated as components of the application. Using such a view, a user trying to comprehend the application can grasp the functionality and how the functionally cohesive groups of program units interact with each other. Due to factors, such as, for example, lack of documentation or unavailability of updated documentation for an application, a component level view of an application can be difficult to achieve. Further, for large scale applications, manual component discovery can be challenging.